home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / artemis1 / src / colspace.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-05-14  |  20.1 KB  |  773 lines

  1. /*
  2.     colspace.c : 色空間からの色選択
  3. */
  4.  
  5. // #define    DEBUG
  6.  
  7. #include <stdlib.h>
  8. #include <stdlib.h>
  9. #include <msdos.cf>
  10. #include <string.h>
  11.  
  12. #include "ge.h"
  13. #include "imageman.h"
  14. #include "dispman.h"
  15. #include "mainmenu.h"
  16.  
  17. #define    METHOD    1        /* 0=HLSサークル 1=HLS△形 */
  18. #define    TRIMETHOD    1
  19.  
  20. #define    SPCSIZ1    176    /* 画面拡大率が1倍のときの HSV サークルの大きさ */
  21.                         
  22.  
  23. static    int        curcol;
  24.  
  25. /*--------------------------------------------------------*/
  26. /*                      色相系の変換                      */
  27. /*--------------------------------------------------------*/
  28.  
  29. void hls_rgb(deci h,deci l,deci s, int *r, int *g, int *b)
  30. {
  31.     deci h2v(deci h, deci cmin, deci cmax)
  32.     {
  33.         while (h<0)            h+=ID(1);
  34.         while (h>=ID(1))     h-=ID(1);
  35.         h*=6;
  36.         int t=h/ID(1); deci r=h%ID(1);
  37.         if (t==0)                return cmin+DMUL(cmax-cmin,r);
  38.         else if (t==1||t==2)    return cmax;
  39.         else if (t==3)            return cmin+DMUL(cmax-cmin,ID(1)-r);
  40.         else                    return cmin;
  41.     }
  42.     deci cmin,cmax;
  43.     if(l<0) l=0; if(l>ID(1)) l=ID(1);
  44.     if(s<0) s=0; if(s>ID(1)) s=ID(1);
  45.     while (h<0)            h+=ID(1);
  46.     while (h>=ID(1))     h-=ID(1);
  47.     h*=6;
  48.     if(l<=ID(1)/2)    cmin=DMUL(l,ID(1)-s),cmax=2*l-cmin;
  49.     else            cmax=DMUL(l,ID(1)-s)+s,cmin=2*l-cmax;
  50.     *r = (31*h2v((h+ID(2))/6,cmin,cmax) + ID(1)/2) / ID(1);
  51.     *g = (31*h2v(h/6,cmin,cmax)         + ID(1)/2) / ID(1);
  52.     *b = (31*h2v((h-ID(2))/6,cmin,cmax) + ID(1)/2) / ID(1);
  53. }
  54.  
  55. void rgb_hls(int _r, int _g, int _b, deci *h, deci *l, deci *s)
  56. {
  57.     deci r,g,b,cmin,cmax,cd;
  58.     r = (IntToDeci(_r) + FD(0.5)) / 31;
  59.     g = (IntToDeci(_g) + FD(0.5)) / 31;
  60.     b = (IntToDeci(_b) + FD(0.5)) / 31;
  61.     cmax = _max(r,g,b);
  62.     cmin = _min(r,g,b);
  63.     *l = (cmax+cmin)/2;
  64.     cd = cmax-cmin;
  65.     if (cd==0) {*h=*s=0; return;}
  66.     if (*l<=ID(1)/2)    *s=DivDeci(cd,cmax+cmin);
  67.     else                *s=DivDeci(cd,ID(2)-(cmax+cmin));
  68.          if(r==cmax) *h=DivDeci(g-b,cd);
  69.     else if(g==cmax) *h=ID(2)+DivDeci(b-r,cd);
  70.     else if(b==cmax) *h=ID(4)+DivDeci(r-g,cd);
  71.     (*h)/=6;
  72.     while(*h<0) (*h)+=ID(1);
  73.     while(*h>ID(1)) (*h)-=ID(1);
  74. }
  75.  
  76. /*--------------------------------------------------------*/
  77. /*                   HLS サークルの表示                   */
  78. /*--------------------------------------------------------*/
  79.  
  80. #if 0
  81. static void drawHLScircle(int x1,int y1,int size,int col)
  82. {
  83.     int i;
  84.     grboxfill(x1,y1,size,size,0,DrawNORMAL);
  85.     void drawcircle(deci l)
  86.     {
  87.         int h,s,r,g,b;
  88.         int x,y,xa,ya,rx,ry;
  89.         for (y=0; y<size; y++)
  90.         {
  91.             unsigned short int gbuf[512]; //,gbuf2[512];
  92.             int gbufx, gbuflen = 0;
  93.             ry = ID(y) + FD(0.5) - ID(size)/2;
  94.             ya = _abs(ry);
  95.             for (x=0; x<size; x++)
  96.             {
  97.                 rx = ID(x) + FD(0.5) - ID(size)/2;
  98.                 xa = _abs(rx);
  99.                 // s = 
  100.                 // DivDeci(isqrt(AdjMulDeci(rx*rx+ry*ry)), ID(size)/2);
  101.                 // if ( DI(xa)*xa+DI(xa)*xa <= (size/2)*(ID(size)/2) )
  102.                 s = DivDeci(isqrt(DI(xa)*xa+DI(ya)*ya),ID(size)/2);
  103.                 if (s <= DUNIT)
  104.                 // s = ID(1);
  105.                 // if ( DI(xa)*xa+DI(xa)*xa <= (size/2)*(ID(size)/2) )
  106.                 {
  107.     /*
  108.                     象限と傾き(1より大きいか否か)により、8通りに場合分け
  109.                         第一象限、|y| <= |x|: theta = acos512(dest / x)
  110.                         第一象限、|y| > |x|    : theta = 128-acos512(dest / y)
  111.                         第二象限、|y| > |x|    : theta = 128+acos512(dest / y)
  112.                         第二象限、|y| <= |x|: theta = 256-acos512(dest / (-x))
  113.                         第三象限、|y| <= |x|: theta = 256+acos512(dest / (-x))
  114.                         第三象限、|y| > |x|    : theta = 384-acos512(dest / (-y))
  115.                         第四象限、|y| > |x|    : theta = 384+acos512(dest / (-y))
  116.                         第四象限、|y| <= |x|: theta = 512-acos512(dest / x)
  117.     */
  118.                     int sg = (ya <= xa ? 0 : 1);
  119.                     int theta;
  120.                     #define r1  DivDeci(ya,xa)
  121.                     #define r2  DivDeci(xa,ya)
  122.                     #define I(n) IntToDeci((n)*128)
  123.                     if (rx == 0 && ry == 0)
  124.                         ;
  125.                     else if (ry > 0)
  126.                         if (rx > 0)
  127.                             theta = (sg==0? atan512(r1) : I(1)-atan512(r2));
  128.                         else
  129.                             theta = (sg==1? I(1)+atan512(r2):I(2)-atan512(r1));
  130.                     else
  131.                         if (rx < 0)
  132.                             theta = (sg==0? I(2)+atan512(r1):I(3)-atan512(r2));
  133.                         else
  134.                             theta = (sg==1? I(3)+atan512(r2):I(4)-atan512(r1));
  135.                     h = theta / 512;
  136.                     hls_rgb(h,l,s,&r,&g,&b);
  137.                     if (gbuflen == 0)
  138.                         gbufx = x1+x;
  139.                     gbuf[gbuflen] = 1024*g+32*r+b;
  140.                     // gbuf2[gbuflen] = 1024*b+32*r+g;
  141.                     gbuflen++;
  142.                 }
  143.             }
  144.             if (gbuflen > 0)
  145.             {
  146.                 grp_putblk(gbufx,y1+y,gbuflen,1, (char*)gbuf, DrawNORMAL);
  147.                 // grp_putblk(gbufx,Y0-y,gbuflen,1, (char*)gbuf2, DrawNORMAL);
  148.             }
  149.         }
  150.     }
  151.     deci h,l,s;
  152.     rgb_hls(getR(col),getG(col),getB(col),&h,&l,&s);
  153.     drawcircle(l);
  154. }
  155. #endif
  156.  
  157. /*--------------------------------------------------------*/
  158. /*          HLS三角形&色相グラデーションの表示           */
  159. /*--------------------------------------------------------*/
  160.  
  161. void drawHLStriangle(int x1,int y1,int xlen,int ylen,deci h)
  162. {
  163. #if TRIMETHOD==0
  164.     grboxfill(x1,y1,xlen,ylen,32767,DrawNORMAL);
  165.     deci h,l,s;
  166.     rgb_hls(getR(col),getG(col),getB(col),&h,&l,&s);
  167.     int iy;
  168.     for (iy=0; iy<ylen;iy++)
  169.     {
  170.         if (ylen-1 > 0)
  171.             l = (ID(ylen-1-iy)+FD(0.5)) / (ylen-1);
  172.         else
  173.             l = ID(1);
  174.         int rightx;
  175.         rightx = DI(xlen *
  176.                     DivDeci(ID(ylen)/2-_abs(ID(iy)+FD(0.5)-ID(ylen)/2),
  177.                             ID(ylen)/2))
  178.                  - 1;
  179.         if (rightx<0) rightx=0;
  180.         int gbuflen = 0, gbufx;
  181.         short int gbuf[512];
  182.         int ix;
  183.         for (ix=0; ix<=rightx; ix++)
  184.         {
  185.             if (rightx>0)
  186.                 s = ID(ix) / rightx;
  187.             int r,g,b;
  188.             hls_rgb(h,l,s,&r,&g,&b);
  189.             if (gbuflen == 0)
  190.                 gbufx = x1+ix;
  191.             gbuf[gbuflen] = 1024*g+32*r+b;
  192.             gbuflen++;
  193.         }
  194.         if (gbuflen > 0)
  195.             grp_putblk(gbufx,y1+iy,gbuflen,1,(char*)gbuf, DrawNORMAL);
  196.     }
  197. #else
  198.     // xmemcpy(0x104,0x40000+1024*y+x1*2,getds(),(int)colmap,(x2-x1+1)*2);
  199.     int vramseg,vramadrs,vramstep;
  200.     vramseg = (DMgetifonepage() ? 0x10c : 0x104);
  201.     vramadrs = 1024*y1+2*x1+(DMgetifonepage() ? 0 : 0x40000);
  202.     vramstep = 1024;
  203.     short int gbuf[512];
  204.     if (ylen<=1)
  205.         return;
  206.     deci or,og,ob; // S=1,L=0.5 の色
  207.     hls_rgb(h,FD(0.5),FD(1.0), &or,&og,&ob);
  208.     or=ID(or);
  209.     og=ID(og);
  210.     ob=ID(ob);
  211.     deci ylen_h = ID(ylen)/2;
  212.     deci xwidth, xwidth_r;
  213.     xwidth = xlen * DivDeci(FD(0.5), ylen_h),
  214.     xwidth_r = DivDeci(ID(xlen), ylen_h);
  215.     deci gray,gray_r;        // S=0 の無彩色の各R,G,Bの強さと、その変化量
  216.     gray = FD(31.5);
  217.     gray_r = -ID(31)/(ylen-1);
  218.     deci s1r,s1g,s1b,s1r_r,s1g_r,s1b_r;    // S=1 の色と、その変化量
  219.     s1r = s1g = s1b = FD(31.5);
  220.     s1r_r = -DivDeci(ID(31)-or,ylen_h-FD(0.5));
  221.     s1g_r = -DivDeci(ID(31)-og,ylen_h-FD(0.5));
  222.     s1b_r = -DivDeci(ID(31)-ob,ylen_h-FD(0.5));
  223.     int py=y1;
  224.     int iy;
  225.     for (iy=(ylen+1)/2;iy;iy--,
  226.          xwidth+=xwidth_r,s1r+=s1r_r,s1g+=s1g_r,s1b+=s1b_r,py++,gray+=gray_r)
  227.     {
  228.         int l=_max(1,DI(xwidth));
  229.         deci sr,sg,sb,sr_r,sg_r,sb_r;
  230.         sr=gray,sg=gray,sb=gray;
  231.         sr_r=DivDeci(s1r-sr,xwidth);
  232.         sg_r=DivDeci(s1g-sg,xwidth);
  233.         sb_r=DivDeci(s1b-sb,xwidth);
  234.         //int i;
  235.         //for (i=0; i<l; i++, sr+=sr_r,sg+=sg_r,sb+=sb_r)
  236.         //    gbuf[i] = GRB(sg>>DECIMAL,sr>>DECIMAL,sb>>DECIMAL);
  237.         makeHLSgradline((char *)gbuf,l,sr,sg,sb,sr_r,sg_r,sb_r);
  238.         gbuf[l]=gbuf[l-1];
  239.         gbuf[l+1]=gbuf[l-1];
  240.         // grp_putblk(x1,py,l,1,(char*)gbuf, DrawNORMAL);
  241.         if (DMgetifonepage())
  242.             xmemcpy(vramseg,vramadrs,getds(),(int)gbuf,l*2);
  243.         else
  244.             xmemcpy(vramseg,vramadrs,getds(),(int)gbuf,_min(xlen,l+2)*2);
  245.         vramadrs += vramstep;
  246.         // ghline(x1,x1+l-1,py,GRB(s1g>>DECIMAL,s1r>>DECIMAL,s1b>>DECIMAL),DrawNORMAL);
  247.     }
  248.     if (ylen%2==0)
  249.     {
  250.         xwidth -= xwidth_r, iy=ylen/2;
  251.         s1r-=s1r_r/2,s1g-=s1g_r/2,s1b-=s1b_r/2;
  252.     }
  253.     else
  254.     {
  255.         xwidth -= xwidth_r*2, iy=(ylen-1)/2;
  256.         s1r-=s1r_r,s1g-=s1g_r,s1b-=s1b_r;
  257.     }
  258.     s1r_r = -DivDeci(or,ylen_h-FD(0.5));
  259.     s1g_r = -DivDeci(og,ylen_h-FD(0.5));
  260.     s1b_r = -DivDeci(ob,ylen_h-FD(0.5));
  261.     if (ylen%2==0)
  262.         s1r+=s1r_r/2,s1g+=s1g_r/2,s1b+=s1b_r/2;
  263.     else
  264.         s1r+=s1r_r,s1g+=s1g_r,s1b+=s1b_r;
  265.     xwidth_r = -xwidth_r;
  266.     for (;iy;iy--,
  267.          xwidth+=xwidth_r,s1r+=s1r_r,s1g+=s1g_r,s1b+=s1b_r,py++,gray+=gray_r)
  268.     {
  269.         int l=_max(1,DI(xwidth));
  270.         deci sr,sg,sb,sr_r,sg_r,sb_r;
  271.         sr=gray,sg=gray,sb=gray;
  272.         sr_r=DivDeci(s1r-sr,xwidth);
  273.         sg_r=DivDeci(s1g-sg,xwidth);
  274.         sb_r=DivDeci(s1b-sb,xwidth);
  275.         makeHLSgradline((char *)gbuf,l,sr,sg,sb,sr_r,sg_r,sb_r);
  276.         gbuf[l]=gbuf[l-1];
  277.         gbuf[l+1]=gbuf[l-1];
  278.         // int i;
  279.         // for (i=0; i<l; i++, sr+=sr_r,sg+=sg_r,sb+=sb_r)
  280.         //    gbuf[i] = GRB(sg>>DECIMAL,sr>>DECIMAL,sb>>DECIMAL);
  281.         if (DMgetifonepage())
  282.             xmemcpy(vramseg,vramadrs,getds(),(int)gbuf,l*2);
  283.         else
  284.             xmemcpy(vramseg,vramadrs,getds(),(int)gbuf,_min(xlen,l+2)*2);
  285.         vramadrs += vramstep;
  286.         // grp_putblk(x1,py,l,1,(char*)gbuf, DrawNORMAL);
  287.         // ghline(x1,x1+l-1,py,GRB(s1g>>DECIMAL,s1r>>DECIMAL,s1b>>DECIMAL),DrawNORMAL);
  288.     }
  289. #endif
  290. }
  291.  
  292. void drawHgradation(int x1,int y1,int xlen,int ylen)
  293. {
  294.     if (ylen>xlen)
  295.     {
  296.         int iy;
  297.         for (iy=0; iy<ylen; iy++)
  298.         {
  299.             deci h;
  300.             h = (ID(ylen-1-iy)+FD(0.5)) / (ylen-1);
  301.             int r,g,b;
  302.             hls_rgb(h,FD(0.5),FD(1.0),&r,&g,&b);
  303.             ghline(x1,x1+xlen-1,y1+iy,r*32+g*1024+b,DrawNORMAL);
  304.         }
  305.     }
  306. }
  307.  
  308. /*--------------------------------------------------------*/
  309. /*                色空間表示メニューの定義                */
  310. /*--------------------------------------------------------*/
  311.  
  312. /*
  313. enum {
  314.     itemColList=0,
  315.     itemColSpace, itemColSpace2, itemColSpace3,
  316.     itemH,itemS,itemV
  317. };
  318. */
  319.  
  320. #define    ITM(n)        colspcmenu_buttons[n]
  321. #define    BAR(id)        menu_scrollbar(&colspcmenu,id)
  322. #define    BARVARP(p)    menu_scrollbar_getvar(p)
  323. #define    BARVAR(n)    menu_scrollbar_getvar(menu_scrollbar(&colspcmenu,n))
  324. static void barmove_H(),barmove_LS();
  325. static void disp_colspcmenu(), erase_colspcmenu();
  326.  
  327. #include "colspace.md"
  328.  
  329. static bool menu2OK = NO; // disp_colspcmenu() は呼び出し済みか
  330. static bool colspc2;    // 色空間2(たとえばHバー)を表示しているかどうか
  331.  
  332. static void draw_cross(int x, int y)
  333. {
  334.     page_menu();
  335.     int c;
  336.     if (DMgetifonepage())
  337.         c = menu_plt(White);
  338.     else
  339.         c = menu_plt(Black);
  340.     ghline(x-5,x+5,y,c,DrawXOR);
  341.     ghline(x-2,x+2,y,c,DrawXOR);
  342.     gvline(x,y-5,y+5,c,DrawXOR);
  343.     gvline(x,y-2,y+2,c,DrawXOR);
  344.     if (DMgetifonepage())
  345.         c = menu_plt(DarkGray);
  346.     else
  347.         c = menu_plt(White);
  348.     ghline(x-2,x+2,y,c,DrawXOR);
  349.     gvline(x,y-2,y+2,c,DrawXOR);
  350. }
  351.  
  352. /* Hグラデーションバーのカーソルの表示/消去 */
  353.  
  354. static bool Hcsr_disp = NO;
  355. static int Hcsr_x, Hcsr_y;
  356.  
  357. static void erase_Hcsr(void)
  358. {
  359.     if (!Hcsr_disp)
  360.         return;
  361.     draw_cross(Hcsr_x,Hcsr_y);
  362.     Hcsr_disp = NO;
  363. }
  364.  
  365. static void disp_Hcsr(deci h)
  366. {
  367.     int ix,iy,ixlen,iylen;
  368.     menu_getbuttonxy(&colspcmenu, itemColSpace2, &ix, &iy, &ixlen, &iylen);
  369.     int tx,ty;
  370.     tx = ix + ixlen/2;
  371.     ty = iy + (iylen-1) - DI((iylen-1) * h);
  372.     if (Hcsr_disp && Hcsr_x==tx && Hcsr_y==ty)
  373.         return;
  374.     if (Hcsr_disp)
  375.         erase_Hcsr();
  376.     draw_cross(tx,ty);
  377.     Hcsr_x = tx;
  378.     Hcsr_y = ty;
  379.     Hcsr_disp = YES;
  380. }
  381.  
  382. /* L,Sカーソルの表示/消去 */
  383.  
  384. static bool LScsr_disp = NO;
  385. static int LScsr_x,LScsr_y;
  386.  
  387. static void erase_LScsr(void)
  388. {
  389.     if (!LScsr_disp)
  390.         return;
  391.     draw_cross(LScsr_x,LScsr_y);
  392.     LScsr_disp = NO;
  393. }
  394.  
  395. static void disp_LScsr(deci l,deci s)
  396. {
  397.     int ix,iy,ixlen,iylen;
  398.     menu_getbuttonxy(&colspcmenu, itemColSpace, &ix, &iy, &ixlen, &iylen);
  399.     int tx,ty;
  400.     ty = iy + ((iylen-1) * (DUNIT-l) + DUNIT/2) / DUNIT;
  401.     tx = ix + DI(DI((ixlen-1) * (ID(1)/2-_abs(l-ID(1)/2))*2) * s);
  402.     if (LScsr_disp && LScsr_x==tx && LScsr_y==ty)
  403.         return;
  404.     if (LScsr_disp)
  405.         erase_LScsr();
  406.     draw_cross(tx,ty);
  407.     LScsr_x = tx;
  408.     LScsr_y = ty;
  409.     LScsr_disp = YES;
  410. }
  411.  
  412. /* 色空間メニューの表示・消去 */
  413.  
  414. static void disp_HLStriangle_hole(int x1,int y1,int xlen,int ylen)
  415. {
  416.     if (ylen<=1)
  417.         return;
  418.     deci ylen_h = ID(ylen)/2;
  419.     deci xwidth, xwidth_r;
  420.     xwidth = xlen * DivDeci(FD(0.5), ylen_h),
  421.     xwidth_r = DivDeci(ID(xlen), ylen_h);
  422.     int py=y1;
  423.     int iy;
  424.     for (iy=(ylen+1)/2;iy;iy--,xwidth+=xwidth_r,py++)
  425.       { int l=_max(1,DI(xwidth)); ghline(x1,x1+l-1,py,0,DrawNORMAL); }
  426.     if (ylen%2==0)
  427.         xwidth -= xwidth_r, iy=ylen/2;
  428.     else
  429.         xwidth -= xwidth_r*2, iy=(ylen-1)/2;
  430.     xwidth_r = -xwidth_r;
  431.     for (;iy;iy--,xwidth+=xwidth_r,py++)
  432.       { int l=_max(1,DI(xwidth)); ghline(x1,x1+l-1,py,0,DrawNORMAL); }
  433. }
  434.  
  435. static void disp_HLStriangle(void)
  436. {
  437.     int ix,iy,ixlen,iylen;
  438.     menu_getbuttonxy(&colspcmenu, itemColSpace, &ix, &iy, &ixlen, &iylen);
  439.     int zr = DMimage_getzoomrate();
  440.     page_edit();
  441.     drawHLStriangle(DMgetpage1x(ix),DMgetpage1y(iy),ixlen/zr,iylen/zr,
  442.                     (ID(BARVAR(barI0))+FD(0.5)) / 99);
  443. }
  444.  
  445. static void disp_colspcmenu()
  446. {
  447.     PRINT("disp_colspcmenu begin\n");
  448.     int ix,iy,ixlen,iylen,ix2,iy2,ixlen2,iylen2;
  449.     menu_getbuttonxy(&colspcmenu, itemColList, &ix, &iy, NULL, NULL);
  450.     drawPltList(ix,iy);
  451.     drawPltCsr(pltnum);
  452.     PRINT("パレットリスト表示終了\n");
  453.     menu_getbuttonxy(&colspcmenu, itemColSpace, &ix, &iy, &ixlen, &iylen);
  454.     menu_getbuttonxy(&colspcmenu, itemColSpace2, &ix2, &iy2, &ixlen2, &iylen2);
  455.     colspc2 = (ixlen2 == 0 ? NO : YES);
  456.     int zr = DMimage_getzoomrate();
  457.     if (!DMgetifonepage())
  458.     {
  459.         if (DMmenu2_addbox(ix,iy,ixlen,iylen) != 0)
  460.             goto NOCIRCLE;
  461.         if (colspc2)
  462.             if (DMmenu2_addbox(ix2,iy2,ixlen2,iylen2) != 0)
  463.                 goto NOCIRCLE;
  464.     }
  465.     PRINT("menu2 処理終了\n");
  466.     page_menu();
  467.     // grboxfill(ix,iy,ixlen,iylen,0,DrawNORMAL);
  468.     if (colspc2)
  469.     {
  470.         grboxfill(ix2,iy2,ixlen2,iylen2,0,DrawNORMAL);
  471.         grboxline(ix2-1,iy2-1,ixlen2+2,iylen2+2,menu_plt(Black),DrawNORMAL);
  472.     }
  473.     page_edit();
  474.     if (METHOD == 0)
  475.         ;
  476. #if 0
  477.         drawHLScircle(DMgetpage1x(ix),DMgetpage1y(iy),
  478.             ixlen/zr,plt_getcode(pltnum));
  479. #endif
  480.     else if (METHOD == 1)
  481.     {
  482.         page_menu();
  483.         disp_HLStriangle_hole(ix,iy,ixlen,iylen);
  484.         PRINT("ホール表示終了\n");
  485.         page_edit();
  486.         disp_HLStriangle();
  487.         drawHgradation(DMgetpage1x(ix2),DMgetpage1y(iy2),ixlen2/zr,iylen2/zr);
  488.         PRINT("グラデーション表示終了\n");
  489.     }
  490. NOCIRCLE:
  491.     page_menu();
  492.     deci h,l,s;
  493.     h = (ID(BARVAR(barI0)) + FD(0.5)) / 99;
  494.     l = (ID(BARVAR(barI1)) + FD(0.5)) / 99;
  495.     s = (ID(BARVAR(barI2)) + FD(0.5)) / 99;
  496.     disp_Hcsr(h);
  497.     disp_LScsr(l,s);
  498.     menu2OK = YES;
  499.     PRINT("disp_colspcmenu end");
  500. }
  501.  
  502. static void erase_colspcmenu()
  503. {
  504.     PRINT("erase_colspcmenu begin");
  505.     menu2OK = NO;
  506.     erase_LScsr();
  507.     erase_Hcsr();
  508.     if (!DMgetifonepage())
  509.     {
  510.         DMmenu2_deletebox();
  511.         if (colspc2)
  512.             DMmenu2_deletebox();
  513.     }
  514.     erasePltList();
  515.     PRINT("erase_colspcmenu end");
  516. }
  517.  
  518. /* スクロールバーの更新処理 */
  519.  
  520. static void barmove_H(void)
  521. {
  522.     if (!menu2OK)
  523.         return;
  524.     deci h,l,s;
  525.     h = (ID(BARVAR(barI0))+FD(0.5)) / 99;
  526.     l = (ID(BARVAR(barI1))+FD(0.5)) / 99;
  527.     s = (ID(BARVAR(barI2))+FD(0.5)) / 99;
  528.     // int r,g,b;
  529.     // hls_rgb(h,l,s,&r,&g,&b);
  530.     plt_setHLS(pltnum, h,l,s);
  531.     makeupPltList();
  532.     erase_Hcsr();
  533.     erase_LScsr();
  534.     disp_HLStriangle();
  535.     disp_Hcsr(h);
  536.     disp_LScsr(l,s);
  537. }
  538.  
  539. static void barmove_LS(void)
  540. {
  541.     if (!menu2OK)
  542.         return;
  543.     deci h,l,s;
  544.     h = (ID(BARVAR(barI0))+FD(0.5)) / 99;
  545.     l = (ID(BARVAR(barI1))+FD(0.5)) / 99;
  546.     s = (ID(BARVAR(barI2))+FD(0.5)) / 99;
  547.     // int r,g,b;
  548.     // hls_rgb(h,l,s,&r,&g,&b);
  549.     plt_setHLS(pltnum, h,l,s);
  550.     makeupPltList();
  551.     disp_Hcsr(h);
  552.     disp_LScsr(l,s);
  553. }
  554.  
  555. /*--------------------------------------------------------*/
  556. /*         画面状態に応じて、メニューの定義を調整         */
  557. /*--------------------------------------------------------*/
  558.  
  559. static void setmenu(void)
  560. {
  561.     BUTTON *bp0 = menu_button(&colspcmenu, itemColSpace);
  562.     BUTTON *bp1 = menu_button(&colspcmenu, itemColSpace2);
  563.     BUTTON *bp2 = menu_button(&colspcmenu, itemColSpace3);
  564.     if (METHOD == 0)
  565.     {
  566.         *bp0 = notHLSsubbutton[0];
  567.         menu_button_setid(bp0,itemColSpace);
  568.         *bp1 = notHLSsubbutton[1];
  569.         menu_button_setid(bp1,itemColSpace2);
  570.         *bp2 = notHLSsubbutton[2];
  571.         menu_button_setid(bp2,itemColSpace3);
  572.     }
  573.     else
  574.     {
  575.         *bp0 = HLSsubbutton[0];
  576.         menu_button_setid(bp0,itemColSpace);
  577.         *bp1 = HLSsubbutton[1];
  578.         menu_button_setid(bp1,itemColSpace2);
  579.         *bp2 = HLSsubbutton[2];
  580.         menu_button_setid(bp2,itemColSpace3);
  581.     }
  582. }
  583.  
  584. /*--------------------------------------------------------*/
  585. /*          色空間内を直接クリックしたときの処理          */
  586. /*--------------------------------------------------------*/
  587.  
  588. static void touchLStriangle(int ax, int ay)
  589. {
  590.     deci h,l,s;
  591.     h = (ID(BARVAR(barI0))+FD(0.5)) / 99;
  592.     int ixlen,iylen;
  593.     menu_getbuttonxy(&colspcmenu,itemColSpace,NULL,NULL,&ixlen,&iylen);
  594.     l = (ID(iylen-1-ay)+FD(0.5)) / (iylen-1);
  595.     deci width = ixlen * (FD(0.5)-_abs(l-FD(0.5))) * 2;
  596.     if (width == 0)
  597.         s = 0;
  598.     else if (ID(ax) <= width)
  599.         s = DivDeci(ID(ax),width);
  600.     else
  601.         s = FD(1.0);
  602.     // int r,g,b;
  603.     // hls_rgb(h,l,s,&r,&g,&b);
  604.     plt_setHLS(pltnum, h,l,s);
  605.     makeupPltList();
  606.     disp_LScsr(l,s);
  607.     menu_scrollbar_setvar(BAR(barI0),_lim(DI(99 * h),0,99));
  608.     menu_scrollbar_setvar(BAR(barI1),_lim(DI(99 * l),0,99));
  609.     menu_scrollbar_setvar(BAR(barI2),_lim(DI(99 * s),0,99));
  610. }
  611.  
  612. static void touchHgrad(int ax,int ay)
  613. {
  614.     deci h,l,s;
  615.     int r,g,b;
  616.     l = (ID(BARVAR(barI1))+FD(0.5)) / 99;
  617.     s = (ID(BARVAR(barI2))+FD(0.5)) / 99;
  618.     int iylen;
  619.     menu_getbuttonxy(&colspcmenu,itemColSpace2,NULL,NULL,NULL,&iylen);
  620.     h = (ID(iylen-1-ay)+FD(0.5)) / (iylen-1);
  621.     plt_setH(pltnum, h);
  622.     // plt_setcode(pltnum, GRB(g,r,b));
  623.     menu_scrollbar_setvar(BAR(barI0),_lim(DI(99 * h),0,99));
  624.     menu_scrollbar_setvar(BAR(barI1),_lim(DI(99 * l),0,99));
  625.     menu_scrollbar_setvar(BAR(barI2),_lim(DI(99 * s),0,99));
  626.     makeupPltList();
  627.     erase_Hcsr();
  628.     erase_LScsr();
  629.     disp_HLStriangle();
  630.     disp_Hcsr(h);
  631.     disp_LScsr(l,s);
  632. }
  633.  
  634. void commandColspace()
  635. {
  636.     PRINT("COLSPACE begin\n");
  637.     setmenu();    // 画面状態に応じて、メニューの定義を調整する
  638.     PRINT("setmenu end\n");
  639.     deci h,l,s;
  640.     plt_getHLS(pltnum, &h,&l,&s);
  641.     menu_scrollbar_setvar(BAR(barI0),_lim(DI(99 * h),0,99));
  642.     menu_scrollbar_setvar(BAR(barI1),_lim(DI(99 * l),0,99));
  643.     menu_scrollbar_setvar(BAR(barI2),_lim(DI(99 * s),0,99));
  644.     PRINT("scrollbar_setvar end\n");
  645.     menu_disp(&colspcmenu);
  646.     PRINT("menu_disp end\n");
  647.     int btn1_area = -1;
  648.     int _preax=-1,_preay=-1;
  649.     for (;;)
  650.     {
  651.         DMdispcsr(ms.x,ms.y);
  652.         for (;;)
  653.         {
  654.             ms_get(&ms);
  655.             if (ms.dx!=0||ms.dy!=0||ms.btn1!=OFF||ms.btn2!=OFF||key_chk()!=0)
  656.                 break;
  657.         }
  658.         DMerasecsr();
  659.         scrollForCsr(1,1);
  660.         if (ms.btn1 == OFFON)
  661.         {
  662.             int a; int ax,ay; SCROLLBAR *sbarp;
  663.             btn1_area = a = menu_where(ms.x,ms.y,&colspcmenu, &ax,&ay,&sbarp);
  664.             switch (a)
  665.             {
  666.             case itemMoveMenu:
  667.                 menu_move();
  668.                 break;
  669.             case itemSelector:
  670.                 menu_touchselector(&colspcmenu);
  671.                 break;
  672.             case itemScrollBar:
  673.                 menu_touchscrollbar(sbarp, ax,ay);
  674.                 break;
  675.             case itemColList:
  676.                 drawPltCsr(pltnum);    // erase
  677.                 pltnum = ax/16 + (ay/16)*4;
  678.                 drawPltCsr(pltnum);    // draw
  679.                 curcol = plt_getcode(pltnum);
  680.                 {
  681.                     deci h,l,s;
  682.                     plt_getHLS(pltnum,&h,&l,&s);
  683.                     menu_scrollbar_setvar(BAR(barI0),_lim(DI(99 * h),0,99));
  684.                     menu_scrollbar_setvar(BAR(barI1),_lim(DI(99 * l),0,99));
  685.                     menu_scrollbar_setvar(BAR(barI2),_lim(DI(99 * s),0,99));
  686.                     erase_Hcsr();
  687.                     erase_LScsr();
  688.                     disp_HLStriangle();
  689.                     disp_Hcsr(h);
  690.                     disp_LScsr(l,s);
  691.                 }
  692.                 break;
  693.             case itemColSpace:
  694.                 touchLStriangle(ax,ay);
  695.                 break;
  696.             case itemColSpace2:
  697.                 touchHgrad(ax,ay);
  698.                 break;
  699.             }
  700.             _preax=ax,_preay=ay;
  701.         }
  702.         else if (ms.btn1 == ON)
  703.         {
  704.             int ix,iy,ixlen,iylen;
  705.             int ax,ay;
  706.             if (btn1_area == itemColSpace)
  707.             {
  708.                 menu_getbuttonxy(&colspcmenu,itemColSpace,&ix,&iy,&ixlen,&iylen);
  709.                 ax = _lim(ms.x-ix,0,ixlen-1);
  710.                 ay = _lim(ms.y-iy,0,iylen-1);
  711.                 touchLStriangle(ax,ay);
  712.             }
  713.             else if (btn1_area == itemColSpace2)
  714.             {
  715.                menu_getbuttonxy(&colspcmenu,itemColSpace2,&ix,&iy,&ixlen,&iylen);
  716.                 ax = _lim(ms.x-ix,0,ixlen-1);
  717.                 ay = _lim(ms.y-iy,0,iylen-1);
  718.                 if (ax!=_preax || ay!=_preay)
  719.                     touchHgrad(ax,ay);
  720.             }
  721.             _preax=ax,_preay=ay;
  722.         }
  723.         else
  724.             btn1_area = -1;
  725.         if (ms.btn2 == OFFON)
  726.         {
  727.             int a;
  728.             a = menu_where(ms.x,ms.y,&colspcmenu, NULL,NULL,NULL);
  729.             if (a == OutOfMenu)
  730.             {
  731.                 int px,py;
  732.                 px = DMimage_getx(ms.x),  py = DMimage_gety(ms.y);
  733.                 drawPltCsr(pltnum);    // erase
  734.                 plt_setcode(pltnum, EIMpoint(px,py));
  735.                 makeupPltList();
  736.                 drawPltCsr(pltnum);    // draw
  737.                 {
  738.                     deci h,l,s;
  739.                     plt_getHLS(pltnum,&h,&l,&s);
  740.                     menu_scrollbar_setvar(BAR(barI0),_lim(DI(99 * h),0,99));
  741.                     menu_scrollbar_setvar(BAR(barI1),_lim(DI(99 * l),0,99));
  742.                     menu_scrollbar_setvar(BAR(barI2),_lim(DI(99 * s),0,99));
  743.                     erase_Hcsr();
  744.                     erase_LScsr();
  745.                     disp_HLStriangle();
  746.                     disp_Hcsr(h);
  747.                     disp_LScsr(l,s);
  748.                 }
  749.             }
  750.             else
  751.                 break;
  752.         }
  753.     }
  754. exitloop:
  755.     menu_erase();
  756. end:
  757.     PRINT("COLSPACE end\n");
  758.     return;
  759. }
  760.  
  761.  
  762.  
  763. void colspc_debugmsg(char *buf)
  764. {
  765.     #ifdef DEBUG
  766.         sprintf(buf,"(colspc: [%08x])\n",HLScomments[3].DEBUG_M(dspfunc));
  767.     #else
  768.         buf[0]=0;
  769.     #endif
  770. }
  771.  
  772.  
  773.